package demo8

import (
	"fmt"
	"time"
)

/*
	channel超时机制
	1. 在并发编程的通信过程中，最需要处理的就是超时问题，
		即向 channel 写数据时发现 channel 已满，或者从 channel 试图读取数据时发现 channel 为空。
		如果不正确处理这些情况，很可能会导致整个 goroutine 锁死。
	2. Go语言没有提供直接的超时处理机制，但我们可以利用 select 机制。
		虽然 select 机制不是专为超时而设计的，却能很方便地解决超时问题。
		因为 select 的特点是只要其中一个 case 已经完成，程序就会继续往下执行，而不会考虑其他 case 的情况。

*/

// TODO: 没完全实现

// TestDemo89 channel超时机制
func TestDemo89() {
	// 普通的 chan
	ch := make(chan int)

	// 实现超时机制
	timeout := make(chan bool, 1)

	i := <-ch

	fmt.Print(i)

	go func() {
		time.Sleep(1)
		timeout <- true
	}()

	// 然后我们把timeout这个channel利用起来
	select {
	case <-ch:
		// 从 ch 中读取到数据
		fmt.Println("ch 数据")
	case <-timeout:
		// 一直没有从ch中读取到数据，但从timeout中读取到了数据
		fmt.Println("timeout")
	}
}
